﻿//(c) Alexandru Ghiondea, 2011
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using JSONDotNET.Syntax;

namespace JSONDotNET.Visitors
{
    public class DisplayVisitor
    {
        StringBuilder output = new StringBuilder();
        private int tabIndex = 0;
        private const int TABSPACE = 1;
        private string tabs()
        {
            return " ".PadLeft(tabIndex * TABSPACE, ' ');
        }

        public void Visit(CompilationUnit unit)
        {
            Visit(unit.Unit);
        }

        public void Visit(ParsedObject parsedObject)
        {
            tabIndex++;
            output.Append(tabs() + "{");
            output.AppendLine();
            tabIndex++;

            for (int i = 0; i < parsedObject.Members.Count; i++)
            {
                Visit(parsedObject.Members[i]);
                if (i + 1 != parsedObject.Members.Count)
                {
                    output.Append(", ");
                }
                output.AppendLine();
            }
            tabIndex--;
            output.AppendLine(tabs() + "}");
            tabIndex--;
        }

        public void Visit(ParsedPair item)
        {
            output.Append(tabs() + "\"" + item.Name + "\"" + " : ");
            Visit(item.Value);
        }

        public void Visit(StringValue parsedValue)
        {
            output.Append("\"" + parsedValue.Value + "\"");
        }

        public void Visit(IntNumberValue parsedValue)
        {
            output.Append(parsedValue.Value.ToString());
        }

        public void Visit(DoubleNumberValue parsedValue)
        {
            output.Append(parsedValue.Value.ToString());
        }

        public void Visit(NullValue parsedValue)
        {
            output.Append("null");
        }

        public void Visit(ParsedValue parsedValue)
        {
            if (parsedValue.GetType() == typeof(StringValue))
                Visit(parsedValue as StringValue);
            else if (parsedValue.GetType() == typeof(IntNumberValue))
                Visit(parsedValue as IntNumberValue);
            else if (parsedValue.GetType() == typeof(DoubleNumberValue))
                Visit(parsedValue as DoubleNumberValue);
            else if (parsedValue.GetType() == typeof(ParsedObject))
                Visit(parsedValue as ParsedObject);
            else if (parsedValue.GetType() == typeof(ArrayValue))
                Visit(parsedValue as ArrayValue);
            else if (parsedValue.GetType() == typeof(NullValue))
                Visit(parsedValue as NullValue);
        }

        public void Visit(ArrayValue arrayValue)
        {
            tabIndex++;
            output.Append("\n" + tabs() + "[");
            output.AppendLine();

            for (int i = 0; i < arrayValue.Value.Count; i++)
            {
                Visit(arrayValue.Value[i]);
                if (i + 1 != arrayValue.Value.Count)
                {
                    tabIndex++;
                    output.AppendLine(tabs() + ", ");
                    tabIndex--;
                }
            }
            output.Append(tabs() + "]");
            tabIndex--;
        }

        public override string ToString()
        {
            return output.ToString();
        }
    }
}
